/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.unicon.autoservicio.view.bean;

import com.unicon.autoservicio.bean.UsuarioViewBean;
import com.unicon.autoservicio.dao.SeguridadDAO;
import com.unicon.autoservicio.util.FacesUtils;
import com.unicon.sdc.ds.ws.ResultType;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import javax.imageio.ImageIO;
import nl.captcha.Captcha;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 *
 * @author jcabrera
 */
public class OlvidoClaveBean extends BaseManageBean {

    private static long serialVersionUID = 1;
    private String usuario;
    private String cuentaDestino;
    private String pregunta;
    private String respuesta;
    private String selectedUsuario;
    private SelectItem[] lstClienteItems;
    private SelectItem[] lstPrgUnoItems;
    private BufferedImage captchaImage;
    private String guess;
    private String answer;
    private String result;
    private Captcha captcha;
    private List<UsuarioViewBean> listaUsuario;

    /**
     * Creates a new instance of CambioClaveBean
     */
    public OlvidoClaveBean() {

        usuario = "";
        pregunta = "";
        respuesta = "";
        listaUsuario = new ArrayList<UsuarioViewBean>();
        cuentaDestino = "";
        captcha = new nl.captcha.Captcha.Builder(200, 50).addText().addBackground().build();
        guess = "";
        lstClienteItems = null;
        getUsuarioCliente();
    }
    
      /* JMENDOZA | 20140303 | Proy. 817: Se crea metodo que verifica si se ha retornado datos del usuario y cliente en el request */
    /* 20140303-01 | INICIO */
    public void getUsuarioCliente()
    {
        HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        if(request!=null)
        {
            String usuario_ = "";
            String selectedUsuario_ = "";
            
            if((request.getAttribute("login") != null) && (request.getAttribute("usuario") != null))
            {
                usuario_ = request.getAttribute("login").toString() ;
                selectedUsuario_ = request.getAttribute("usuario").toString();
                
                if((!usuario_.isEmpty()) && (!selectedUsuario_.isEmpty()))
                {
                    request.removeAttribute("login");
                    request.removeAttribute("usuario");
                    usuario = usuario_;
                    selectedUsuario = selectedUsuario_;
                    btnBuscarClientesPerformed();
                }
              
            }
        }
    }
    /* 20140303-01 | FIN */
    
    
    
    /* JMENDOZA | 20140303 | Proy. 817: Se crea metodo que guarda en el request el usuario y el cliente */
    /* 20140303-03 | INICIO */
    public void setUsuarioCliente()
    {
        HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        if(request!=null)
        {
            request.setAttribute("login", this.usuario);
            request.setAttribute("usuario", this.selectedUsuario);
            request.setAttribute("flag", "1");
        }
    }
    /* 20140303-03 | FIN */

    public void btnResetClave(ActionEvent e) {

        if (getGuess().equals(getAnswer())) {

            SeguridadDAO seguridadDao = new SeguridadDAO();
            ResultType result = seguridadDao.resetClave(getSelectedUsuario(), respuesta, cuentaDestino);



            if (result.getResult().equals(Boolean.TRUE)) {
                FacesUtils.addErrorMessage("Su Clave ha sido enviada correctamente a la cuenta asociada.");
                inicializarCampos();
            } else {
                FacesUtils.addErrorMessage(result.getMessage());
            }




        } else {
            inicializarCampos();
            FacesUtils.addErrorMessageFromResource("error.codigoCaptchaIncorrecto", null);
            captcha = new nl.captcha.Captcha.Builder(200, 50).addText().addBackground().build();
            captchaImage = captcha.getImage();
        }
        //return true;
    }

    public void refreshCaptcha(ActionEvent event) {
        captcha = new nl.captcha.Captcha.Builder(200, 50).addText().addBackground().build();

        captchaImage = captcha.getImage();

        setAnswer(captcha.getAnswer());
    }

    public boolean btnBuscarClientesPerformed() {

        if (logger.isDebugEnabled()) {
            StringBuffer sb = new StringBuffer("El login ");
            sb.append(usuario).append(" buscando Cliente.");
            logger.debug(sb.toString());
        }

        SeguridadDAO seguridadDao = new SeguridadDAO();
        List<com.unicon.sdc.ds.ws.UsuarioBean> lista = seguridadDao.getEmpresasUsuario(usuario);

        if (lista != null && lista.size() > 0) {

            setLstClienteItems(new SelectItem[lista.size()]);

            int i = 0;
            for (com.unicon.sdc.ds.ws.UsuarioBean usuario : lista) {
                UsuarioViewBean usu = new UsuarioViewBean(usuario);
                getListaUsuario().add(usu);
                getLstClienteItems()[i] = new SelectItem(usuario.getCodigoUsuario(), usuario.getDescripcionCliente());
                if (i == 0) {
                    setPregunta(usu.getPregunta());
                }
                i++;
            }
        } else {

            FacesUtils.addErrorMessageFromResource("error.clientesPorUsuario", null);
            try {
                setLstClienteItems(null);
                throw new Exception("El existen usuarios registrados  para  la cuenta que se desea loguear : " + getUsuario());
            } catch (Exception ex) {
                logger.error(ex.getMessage(), ex);
                return true;
            }

        }



        return true;
    }

    /**
     * @return the usuario
     */
    public String getUsuario() {
         getUsuarioCliente();
        
        return usuario;
    }

    /**
     * @param usuario the usuario to set
     */
    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    /**
     * @return the cuentaDestino
     */
    public String getCuentaDestino() {
        return cuentaDestino;
    }

    /**
     * @param cuentaDestino the cuentaDestino to set
     */
    public void setCuentaDestino(String cuentaDestino) {
        this.cuentaDestino = cuentaDestino;
    }

    /**
     * @return the rptaUno
     */
    public String getRespuesta() {
        return respuesta;
    }

    /**
     * @param rptaUno the rptaUno to set
     */
    public void setRespuesta(String respuesta) {
        this.respuesta = respuesta;
    }

    /**
     * @return the selectedUsuario
     */
    public String getSelectedUsuario() {


        return selectedUsuario;
    }

    /**
     * @param selectedUsuario the selectedUsuario to set
     */
    public void setSelectedUsuario(String selectedUsuario) {


        this.selectedUsuario = selectedUsuario;
    }

    /**
     * @return the lstClienteItems
     */
    public SelectItem[] getLstClienteItems() {
        return lstClienteItems;
    }

    /**
     * @param lstClienteItems the lstClienteItems to set
     */
    public void setLstClienteItems(SelectItem[] lstClienteItems) {
        this.lstClienteItems = lstClienteItems;
    }

    public byte[] getCaptchaImage() {
        if (captchaImage == null) {
            refreshCaptcha(null);
        }
        return covertImageToBytes(captchaImage);
    }

    private static byte[] covertImageToBytes(BufferedImage image) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            ImageIO.write(image, "png", baos);
        } catch (IOException ex) {
        }
        return baos.toByteArray();
    }

    /**
     * @param captchaImage the captchaImage to set
     */
    public void setCaptchaImage(BufferedImage captchaImage) {
        this.captchaImage = captchaImage;
    }

    public boolean onChangeTest(ValueChangeEvent event) {


        if (!event.getPhaseId().equals(PhaseId.INVOKE_APPLICATION)) {
            event.setPhaseId(PhaseId.INVOKE_APPLICATION);
            event.queue();
            return true;
        }


        for (com.unicon.sdc.ds.ws.UsuarioBean cliente : getListaUsuario()) {

            if (selectedUsuario.equals(cliente.getCodigoUsuario())) {

                setPregunta(cliente.getPregunta());
            }
        }

        return true;

    }

    /**
     * @return the guess
     */
    public String getGuess() {
        return guess;
    }

    /**
     * @param guess the guess to set
     */
    public void setGuess(String guess) {
        this.guess = guess;
    }

    /**
     * @return the answer
     */
    public String getAnswer() {
        return answer;
    }

    /**
     * @param answer the answer to set
     */
    public void setAnswer(String answer) {
        this.answer = answer;
    }

    /**
     * @return the result
     */
    public String getResult() {
        return result;
    }

    /**
     * @param result the result to set
     */
    public void setResult(String result) {
        this.result = result;
    }

    /**
     * @return the captcha
     */
    public Captcha getCaptcha() {
        return captcha;
    }

    /**
     * @param captcha the captcha to set
     */
    public void setCaptcha(Captcha captcha) {
        this.captcha = captcha;
    }

    private void inicializarCampos() {
        usuario = "";
        cuentaDestino = "";
        lstClienteItems[0] = new SelectItem("", "Empresas Asociadas");
        pregunta = "";
        respuesta = "";
        captcha = new nl.captcha.Captcha.Builder(200, 50).addText().addBackground().build();
        captchaImage = captcha.getImage();
        guess = "";
        listaUsuario = new ArrayList<UsuarioViewBean>();
    }

    /**
     * @return the lstPrgUnoItems
     */
    public SelectItem[] getLstPrgUnoItems() {
        return lstPrgUnoItems;
    }

    /**
     * @param lstPrgUnoItems the lstPrgUnoItems to set
     */
    public void setLstPrgUnoItems(SelectItem[] lstPrgUnoItems) {
        this.lstPrgUnoItems = lstPrgUnoItems;
    }

    /**
     * @return the pregunta
     */
    public String getPregunta() {

        return pregunta;
    }

    /**
     * @param pregunta the pregunta to set
     */
    public void setPregunta(String pregunta) {
        this.pregunta = pregunta;
    }

    /**
     * @return the listaUsuario
     */
    public List<UsuarioViewBean> getListaUsuario() {
        return listaUsuario;
    }

    /**
     * @param listaUsuario the listaUsuario to set
     */
    public void setListaUsuario(List<UsuarioViewBean> listaUsuario) {
        this.listaUsuario = listaUsuario;
    }
    
     public boolean   buscarClienteListener(ValueChangeEvent event){
      
          if (!event.getPhaseId().equals(PhaseId.INVOKE_APPLICATION)) {
            event.setPhaseId(PhaseId.INVOKE_APPLICATION);
            event.queue();
          return true;  
        }

    
          return  btnBuscarClientesPerformed();  
  }
}
